package main

import (
	"net/http"

	"github.com/gin-gonic/gin"
)

var data = make(map[string]interface{})

// 或者模拟一些私人数据
var secrets = gin.H{
	"weiyigeek": gin.H{"email": "master@weiyigeek.top", "blog": "weiyigeek.top"},
}

func setupRouter() *gin.Engine {
	// Disable Console Color
	gin.DisableConsoleColor()

	// Default返回一个Engine实例，该实例已连接Logger和Recovery中间件。
	r := gin.Default()

	// 示例1.AsciiJSON 生成具有转义的非 ASCII 字符的 ASCII-only JSON。
	r.GET("/AsciiJSON", func(c *gin.Context) {
		data = map[string]interface{}{
			"lang": "GO语言",
			"tag":  "<br>",
		}
		// 针对中文以及特殊符号进行的是Unicode编码
		// 输出 : {"lang":"GO\u8bed\u8a00","tag":"\u003cbr\u003e"}
		c.AsciiJSON(http.StatusOK, data)
	})

	// 示例2.通常，JSON 使用 unicode 替换特殊 HTML 字符，例如 < 变为 \ u003c。如果要按字面对这些字符进行编码，则可以使用 PureJSON。
	// 提供 unicode 实体
	r.GET("/json", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"html": "<b>Hello, world! Go-Gin 框架</b>",
		})
	})
	// 提供字面字符（即原始数据未经过编码处理）
	r.GET("/purejson", func(c *gin.Context) {
		c.PureJSON(http.StatusOK, gin.H{
			"html": "<b>Hello, world! Go-Gin 框架</b>",
		})
	})

	// 示例3.使用 JSONP 向不同域的服务器请求数据,如果查询参数存在回调，则将回调添加到响应体中。
	r.GET("/JSONP", func(ctx *gin.Context) {
		data = map[string]interface{}{
			"name": "WeiyiGeek",
			"site": "weiyigeek.top",
		}
		// /JSONP?callback=u 其默认参数是callback
		// 将输出：u({\"name\":\"WeiyiGeek\",\"site\":\"weiyigeek.top\"})
		ctx.JSONP(http.StatusOK, data)
	})

	// 示例4.使用 SecureJSON 防止 json 劫持，如果给定的结构是数组值，则默认预置 "while(1)," 到响应体。
	r.GET("/SecureJSON", func(c *gin.Context) {
		// 你也可以使用自己的 SecureJSON 前缀，据说Google采用的是while的方法，facebook采用的是for的方法。
		r.SecureJsonPrefix(")]}',\n")

		names := []string{"Go", "Java", "PHP"}
		// 若不设置SecureJsonPrefix，默认输出：for(;;);["Go", "Java", "PHP"]
		c.SecureJSON(http.StatusOK, names)
	})

	return r
}

func main() {
	r := setupRouter()
	// Listen and Server in 0.0.0.0:8080
	r.Run(":8080")
}
